package com.laboratory.stomplearning.config;

import com.laboratory.stomplearning.handler.CustomUserHandshakeHandler;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;

@Configuration
@RequiredArgsConstructor
public class WebSocketStompConfig implements WebSocketMessageBrokerConfigurer {

    private final CustomUserHandshakeHandler customUserHandshakeHandler;

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/ws")
                .setAllowedOriginPatterns("*")
                .setHandshakeHandler(customUserHandshakeHandler)
                .withSockJS();
    }

    /**
     * MessageBrokerRegistry 是 Spring WebSocket 中用于配置消息代理的类，它提供了以下主要方法：
     * enableSimpleBroker()：
     * 启用简单的内存消息代理
     * 参数指定代理处理的目的地前缀
     * 在示例中 /topic 用于广播消息，/queue 用于点对点消息
     * setApplicationDestinationPrefixes()：
     * 设置应用级目的地前缀
     * 客户端发送到此前缀的消息会被路由到 @MessageMapping 注解的方法
     * 示例中 /app 前缀的消息会进入相应的控制器方法
     * setUserDestinationPrefix()：
     * 设置用户目的地前缀
     * 用于点对点通信，每个用户有独立的目的地
     * 示例中 /user 用于用户特定的消息路由
     *
     * @param registry
     */
    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        /**
         * 出站：订阅前缀（广播 /topic，点对点 /queue）
         */
        registry.enableSimpleBroker("/topic", "/queue");
        /**
         * 入站：客户端发送到 /app/** → 进入 @MessageMapping
         */
        registry.setApplicationDestinationPrefixes("/app");
        /**
         * 点对点目的地前缀
         */
        registry.setUserDestinationPrefix("/user");
    }

}
